<?php
/**
 * Template
 *
 * @author del Valle, Federico <quaidy@gmail.com>
 */
class template {
    private $templates =array();
    private $js = array();
    private $css = array();
    private $parametros = array();
    private $template = null;
    private $fonts = array();
    private $scripts = array();

    /**
     * @var smarty
     */
    private $smarty = null;
    private $html = array();

    public function __construct($nombre="") {
      if (configManager::obtener("dev","debug")) { //TODO ver esto  para que carajo era
        
      }

      if (!empty($nombre)) {
        $this->template = $nombre;
      }
      $this->smarty = smartyManager::tomar();
    }

    /**
     * Agrega un js
     *
     * @param string $js_path nombre del js
     */
    public function set_js($js) {
      $this->js[md5($js)] = $js;
    }

    public function set_script($script) {
      $this->scripts[md5($scripts)] = $script;
    }

    /**
     * Agrega un css
     *
     * @param string $css
     */
    public function set_css($css) {
      $this->css[md5($css)] = $css;
    }


    /**
     * Setea un parametro a parsear en el tpl
     *
     * @param string $nombre Nombre del parametro
     * @param string $valor valor del parametro
     * @param string $tpl Tpl interior
     */
    public function asignar($nombre,$valor,$tpl = "") {
      $nombre = strtoupper($nombre);
      if ($tpl == "") {
        $this->parametros[$nombre] = $valor;
      } else {
        $this->templates[strtoupper($tpl)]->asignar($nombre,$valor);
      }
    }

    /**
     * Carga un a fuente en el template
     * @param string $fuente
     */
    public function cargar_fuente($fuente) {
        $this->fonts[$fuente] = $fuente;
    }


    /**
     * Devuelve las fuentes cargadas en este template
     * @param bool $clean
     * @return array
     */
    public function tomar_fuentes($clean=true) {
      foreach ($this->templates as $indice => $template ) {
        if (is_object($template)) {
          $fonts = $template->tomar_fuentes();
          var_dump("merge");
          var_dump($fonts);
          var_dump($this->fonts);

          $this->fonts = array_merge($fonts, $this->fonts);
        }
      }
      $fonts_tmp = $this->fonts;
      if ($clean) {
        $this->fonts = array();
      }
      return $fonts_tmp;
    }

     /**
     * Devuelve los csss cargados en este template
     * @param bool $clean
     * @return array
     */
    public function tomar_css($clean=true) {
     foreach ($this->templates as $indice => $template ) {
        if (is_object($template)) {
          $css = $template->tomar_css();
          $this->css = array_merge($fonts, $this->css);
        }
      }
     // $css_tmp = $this->css;
     /* if ($clean) {
        $this->fonts = array();
      }*/
      return $this->css;
    }

    /**
     * Devuelve los jss cargados en este template
     * @return array
     */
    public function tomar_js() {
    foreach ($this->templates as $indice => $template) {
      if (is_object($template)) {
        $js = $template->tomar_js();
        $this->js = array_merge($fonts, $this->js);
      }
     }
    // $css_tmp = $this->css;
    /* if ($clean) {
      $this->fonts = array();
      } */
    return $this->js;
    }


    /**
     * Devuelve los scripts cargados en este template
     * @return array
     */
    public function tomar_scripts() {
     foreach ($this->templates as $indice => $template) {
      if (is_object($template)) {
        $scripts= $template->tomar_scripts();
        $this->scripts = array_merge($fonts, $this->scripts);
      }
     }
    // $css_tmp = $this->css;
    /* if ($clean) {
      $this->fonts = array();
      } */
    return $this->scripts;
    }

    /**
     * Obtiene un parametro del template
     *
     * @param string $nombre
     * @return mixed
     */
    public function get_parametro($nombre) {
      return $this->parametros[$nombre];
    }

    /**
     * Elimina un parametro de la lista
     *
     * @param string $nombre Parametro a eliminar
     */
    public function unset_parametro($nombre) {
      unset($this->parametros[$nombre]);
    }

    /**
     * Elimina un template
     */
    public function elimina_template($nombre) {
      unset($this->templates[$nombre]);
       unset($this->html[$nombre]);
    }

    /**
     * Construye el "header"
     *
     * @return string
     */
    private function make_header() {
      $header = "";


      if (!empty($this->js)) {
        foreach ($this->js as $js) {
          $header .= '<script type="text/javascript" src="'.URL_FRONT.'js/'.$js.'"></script> '. PHP_EOL;
        }
      }

       if (!empty($this->scripts)) {
        foreach ($this->scripts as $script) {
          $header .= `<script type="text/javascript" >`.$script.`</script> `. PHP_EOL;
        }
      }

        if (!empty($this->fonts)) {
        foreach ($this->fonts as $fuente) {
          $header .="<link href='".URL_FRONT."fonts/get/".$fuente."' rel='stylesheet' type='text/css'>". PHP_EOL;
        }
      }
      
      if (!empty($this->css)) {
        foreach ($this->css as $css) {
          $header .= '<link rel="stylesheet" type="text/css" href="'.URL_FRONT.'/css/'.$css.'" /> '. PHP_EOL;
        }
      }
      return $header;
    }


    /**
     * Adjunta un template
     *
     * @param string $nombre parametro del tpl donde se va a insertar
     * @param template $template
     */
    public function agregar($nombre,$template,$html=false) {
    
      // if (isset($this->parametros[strtoupper($nombre)])) {
    unset($this->html[$nombre]);
    unset($this->templates[$nombre]);
     
     //   throw new Exception("Ya existe un parametro con ese nombre");
    //  } else {
        if ($html == true) {
          $this->html[$nombre] = $template;
        } else {
          if (is_object($template) && (get_class($template) == "template"|| is_subclass_of($template,"template"))) {
            $this->templates[$nombre] = $template;
          } elseif (is_string($template)) {
            $tpl = new template($template);

            $this->templates[$nombre] = $tpl;
          } else {
            throw new Exception("El template no es un objeto valido.");
          }
          
        }
    //  }
    }
    
    /**
     * Devuelve el html ya parseado
     * 
     * @return string HTML ya parseado
     */
    public function get_html () {
      $this->parse_templates();
      if (sesion::get("entorno") != "") {
        try {
          $html = $this->smarty->fetch('/'.sesion::get("entorno").'/'.$this->template);
        } catch (Exception $exc) {
          $html = $this->smarty->fetch($this->template);
        }
      } else {
         $html = $this->smarty->fetch($this->template);
      }

      $html = $this->insertar_header($html);
     // $this->smarty->clearAllAssign();
      return $html;
    }

    /**
     * Parsea los templates y parametros asociados a este template 
     */
    private function parse_templates() {
        
      foreach ($this->templates as $indice => $template ) {
      if (is_object($template)) {
         $fonts = $template->tomar_fuentes();
         $scripts = $template->tomar_scripts();
         $css = $template->tomar_css();
         $js = $template->tomar_js();
         $this->smarty->assign(strtoupper($indice),$template->get_html());
         
         $this->fonts = array_merge($fonts, $this->fonts);
       } else {
         $this->smarty->assign(strtoupper($indice),$template);
       }
      }

      foreach ($this->parametros as $indice => $contenido) {
        $this->smarty->assign(strtoupper($indice), $contenido);
      }

      foreach ($this->html as $indice => $contenido) {
        $this->smarty->assign(strtoupper($indice), $contenido);
      }
    }

    /**
     * Inserta los css's y js's antes del </head> y si no esta al principio del html
     * @param string $html
     * @return string
     */
    private function insertar_header($html) {
        $html_header = $this->make_header();
        $html = str_replace("</head>", $html_header."</head>", $html,$count);
        if ($count == 0) {
            $html = $html_header . $html;
        }
        return $html;
    }
    /**
     *  Muestra en pantalla el tpl 
     */
    public function mostrar($die=true) {
      $html = $this->get_html();
      if (configManager::obtener("general", "devmode")==true) {
        $start = $_SESSION["start-time"];
        $end =  microtime();
        $time = round(($end - $start),4);
        $time_html = "<div style='position: fixed; width: 100%; background-color: yellow; bottom: 0pt;text-align: center;'>".$time." segundos </div>";
        $html = str_replace("</body>",$time_html."</body>", $html,$count);
      }
     
      echo $html;
      if ($die) {
        die();
      }
    }
}
?>
